iT邦幫忙

2023 iThome 鐵人賽

DAY 18
0

在CMake中,有提供 configure_file() 指令來產生 Object-like Macros的功能,常用來標示該軟體的版本號,就像機器學習中常用的GPU加速庫 (cuDNN)一樣,在/usr/local/cuda/include/cudnn.h 中,定義了該庫的版本號。

$ sudo cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A2

https://ithelp.ithome.com.tw/upload/images/20231002/201620264VvA0u013u.png

語法

configure_file

定義:將文件複製到另一個位置並修改其內容。
這次複製version.h.in這個檔案,並在build資料夾中生成version.h,用於產生版本號的 # define

# CMakeLists.txt
configure_file(<input> <output>)
input :  輸入檔名,通常為 <filename>.h.in
output : 輸出檔名,預設輸出位置在 ${PROJECT_BINARY_DIR}
// <filename>.h.in
#define VAR ${VAR}
// 將CMakeLists.txt中名為VAR的變數替換${VAR}

範例

$ git clone https://github.com/m11112089/2023_iT_CMake.git
$ cd ~/2023_iT_CMake/Day18

1. 編輯 CMakeLists.txt

configure_file(version.h.in version.h)
# 將version.h.in輸出成version.h
target_include_directories(main PUBLIC "${PROJECT_BINARY_DIR}")
# 將PROJECT_BINARY_DIR加入main的include路徑,使main可以include到 build/version.h

2. 編輯 version.h.in

#define cmake_totorial_VERSION_MAJOR ${cmake_totorial_VERSION_MAJOR}
#define cmake_totorial_VERSION_MINOR ${cmake_totorial_VERSION_MINOR}
#define cmake_totorial_VERSION_PATCH ${cmake_totorial_VERSION_PATCH}

3. 編輯 src/main.cpp
如果不輸入引數的話就印出版本號

// A simple program that computes the square root of a number
#include <iostream>
#include "mysqrt.h"
#include "version.h"  // <------- 要記得引入生成的 build/version.h ⭐

int main(int argc, char* argv[])
{
  if (argc < 2) {
    // report version
    std::cout << argv[0] << " Version " << cmake_totorial_VERSION_MAJOR << "."
              << cmake_totorial_VERSION_MINOR << "."
              << cmake_totorial_VERSION_PATCH << std::endl;
    return 1;
  }
  
  // convert input to double
  const double inputValue = std::stod(argv[1]);
  const double outputValue = sqrt(inputValue);
  std::cout << "The square root of " << inputValue << " is " << outputValue
            << std::endl;
  return 0;
}

4. 編譯與安裝

$ cmake ..
$ make
$ sudo make install

5. 檢查生成的version.h

$ cat version.h

可以發現,version.h.in中的變數 ${VAR} 被替換成CMakeLists.txt中的變數了
${cmake_totorial_VERSION_MAJOR} ---> 1
${cmake_totorial_VERSION_MINOR} ---> 0
${cmake_totorial_VERSION_PATCH} ---> 0

kai@esoc:~/2023_iT_CMake/Day18/build$ cat version.h 
#define cmake_totorial_VERSION_MAJOR 1
#define cmake_totorial_VERSION_MINOR 0
#define cmake_totorial_VERSION_PATCH 0

6. 執行主程式,看看印出的版本號

$ ./main

kai@esoc:~/2023_iT_CMake/Day18/build$ ./main 
./main Version 1.0.0

Reference

Ubuntu 16.04 install CUDNN


上一篇
[Day 17] 發布軟體流程:ABI Cheacker->Release
下一篇
[Day 19] 使用第三方庫
系列文
建構屬於自己的C/C++專案 : 我的30天CMake學習之旅29
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言